home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlb20 / lib / wait3.c < prev    next >
C/C++ Source or Header  |  1991-11-16  |  1KB  |  70 lines

  1. /* wait3() emulation for MiNT. written by Eric R. Smith and placed in
  2.    the public domain
  3.  */
  4.  
  5. #include <wait.h>
  6. #include <time.h>
  7. #include <resource.h>
  8. #include <mintbind.h>
  9. #include <errno.h>
  10. #include <signal.h>
  11.  
  12. extern int __mint;
  13.  
  14. extern long __waitval;        /* in thread.c */
  15. extern long __waittime;        /* ditto */
  16.  
  17. extern void _ms2tval();        /* in getrusage.c */
  18.  
  19. int
  20. wait3(status, mode, rusage)
  21.     union wait *status;
  22.     int mode;
  23.     struct rusage *rusage;
  24. {
  25.     long r, rsc[8];
  26.     int exit_status, sig_term, pid;
  27.  
  28.     if (__mint == 0) {
  29.         r = __waitval;
  30.         __waitval = -ENOENT;
  31.         rsc[0] = __waittime;
  32.         rsc[1] = 0;
  33.     } else
  34.         r = Pwait3(mode, rsc);
  35.     if (r < 0) {
  36.         errno = -r;
  37.         return -1;
  38.     }
  39.     pid = (r & 0xffff0000L) >> 16;
  40.     if (pid) {
  41.         status->_i = 0;
  42.  
  43.         if ( ((short)r) == -32) {
  44.             sig_term = SIGINT;
  45.             exit_status = 0;
  46.         }
  47.         else {
  48.             exit_status = r & 0x000000ffL;
  49.             sig_term = (r & 0x00007f00L) >> 8;
  50.         }
  51.         if (sig_term && exit_status != 0 && exit_status != 0177)
  52.             sig_term = 0;
  53.         if (exit_status == 0177 && sig_term) {
  54.             status->w_termsig = WSTOPPED;
  55.             status->w_stopsig = sig_term;
  56.         }
  57.         else {
  58.             status->w_termsig = sig_term;
  59.             status->w_retcode = exit_status;
  60.         }
  61.         status->w_coredump = 0;
  62.  
  63.         if (rusage) {
  64.             _ms2tval(rsc[0], &(rusage->ru_utime));
  65.             _ms2tval(rsc[1], &(rusage->ru_stime));
  66.         }
  67.     }
  68.     return pid;
  69. }
  70.